package com.yiwyn;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import lombok.AllArgsConstructor;
import lombok.Data;

public class Main {
    public static void main(String[] args) {

        ApiResponse<Person> apiResponse = new ApiResponse<>();
        apiResponse.setCode(0);
        apiResponse.setMsg("success");
        apiResponse.setData(new Person("Yiwyn", 18));

        String responseJson = JSON.toJSONString(apiResponse);
        // {"code":0,"data":{"age":18,"name":"Yiwyn"},"msg":"success"}

        // 方案1（错误方案） 谈笑风生间把嵌套的泛型抹去了 ApiResponse<Person> => ApiResponse
        ApiResponse apiResponse1 = JSON.parseObject(responseJson, ApiResponse.class);
        Object data = apiResponse1.getData();
        Person p = (Person) data;
        /*
           这里直接转会报错 原因如下
            data 字段的类型信息丢失了。
            这是因为 Java 的泛型在运行时会被擦除（Type Erasure），
            导致 ApiResponse 中的 T 类型信息在运行时无法被保留。
         */
        System.out.println(p);

        // 方案2 使用 TypeReference
        ApiResponse<Person> personApiResponse = JSON.parseObject(responseJson, new TypeReference<ApiResponse<Person>>() {
        });
        Person data1 = personApiResponse.getData();
        System.out.println(data1);
    }


    @Data
    public static class ApiResponse<T> {
        private Integer code;
        private String msg;
        private T data;
    }

    @Data
    @AllArgsConstructor
    public static class Person {
        private String name;
        private Integer age;
    }

}